const { ccclass, property } = cc._decorator;
interface ClickPool { [propname: string]: cc.NodePool }
export default class ParticleConstruct {
  // 包含所有tag对应的对象池
  clickPools: ClickPool = {}
  // 组件上下文
  context: cc.Component = null
  /**
   *
   */
  constructor(context) {
    this.context = context
  }
  /**
     * @description 加载新的粒子节点
     * @author 刘建文
     * @date 2019-10-10
     * @param {*} position 创建粒子的位置
     * @param {*} tag 粒子节点标识-用于对象池回收
     * @param {*} resUrl 资源加载位置
     * @param {*} callBack 毁掉函数
     * @memberof ParticleConstruct
     */
  public Create(position, tag, resUrl) {
    let newNode = null;
    if (!this.clickPools[tag]) {
      //初始化对象池
      this.clickPools[tag] = new cc.NodePool();
    }
    if (this.clickPools[tag].size() > 0) {
      //从对象池请求对象
      newNode = this.clickPools[tag].get();
      this.setClickNode(newNode, tag, position);
    } else {
      // 如果没有空闲对象，我们就用 cc.instantiate 重新创建
      cc.loader.loadRes(resUrl, cc.Prefab, (err: Error, prefab: cc.Prefab) => {
        if (err) {
          return;
        }
        newNode = cc.instantiate(prefab);
        this.setClickNode(newNode, tag, position);
      });
    }
  }
  /**
   * @description 设置节点属性
   * @author 刘建文
   * @date 2019-10-10
   * @param {*} newNode
   * @param {*} position
   * @param {*} callBack
   * @memberof ParticleConstruct
   */
  private setClickNode(newNode, tag = '', position) {
    newNode.name = tag; //设置节点名称
    newNode.setPosition(position); //设置节点位置
    this.context.node.addChild(newNode); //将新的节点添加到当前组件所有节点上
    if (newNode) {
      newNode.getComponent(cc.ParticleSystem).resetSystem();
      // 遍历当前上下文包node节点中已经声明tag类型的节点，根据ParticleSystem状态进行回收
      this.context.node.children.forEach(item => {
        if (item.name === tag) {
          const particle = item.getComponent(cc.ParticleSystem)
          // cc.log(item, particle)
          if (particle.stopped) {
            this.clickPools[tag].put(item)
            cc.log(`回收${tag}`, this.clickPools[tag].size())
          }
        }
      })
    }
    // 100ms以后停止粒子效果播放
    // setTimeout(() => {
    //   const particle = newNode.getComponent(cc.ParticleSystem)
    //   particle.stopSystem()
    //   // this.clickPools.put(newNode)
    // }, 100);
  }
}
